//组合继承 p244
function People() {
    this.nation = 'Chinese';
    this.racial = '汉族';
}

People.prototype.sayMessage = function(){
    console.log(`\nES6前:------------------------->`)
    console.log(`国家:${this.nation} 民族:${this.racial}`);
    return this;
}

function Person(name,age) {
    People.call(this); //复制成员

    this.name = name;
    this.age  = age;
}

Person.prototype = new People(); //打通原型链

Person.prototype.sayHello = function(){ //添加Person自己的原型方法
    console.log(`Hello 我叫${this.name} 年龄:${this.age} :D`);
}

const person = new Person('小红',25);
/*
⚠️20行必须写在22行前面
如果22行在前,就相当于重新设置了Person的原型，如此一来无法检测到sayHello这个公用方法。

⚠️不可使用箭头函数代替构造函数以及原型上的方法
因为箭头函数没有prototype,并且this是在定义时就确定了,指向其父级作用域
*/

person.sayMessage().sayHello();






//Class类 p249 🧊现在用ES6推荐的方式实现继承，明显结构更加清晰，书写方式也更加规范化。
class Peoples{
   //定义示例成员和方法，new的时候会自动调用
   constructor(){
     this.nation = 'Chinese';
     this.racial = '汉族';
   }

   //此方法会自动成为Peoples的原型方法
   sayMessage(){
        console.log(`\n\nES6后:------------------------->`)
        console.log(`国家:${this.nation} 民族:${this.racial}`);
        return this;
   }
}

//类继承 extends
class Persons extends Peoples{
    constructor(name,age){
        super();
        this.name = name;
        this.age  = age;
    }

    sayHello() {
      console.log(`Hello 我叫${this.name} 年龄:${this.age} :D\n`);
    }
}

const person1 = new Persons('佳鸿',26);
person1.sayMessage().sayHello();










